﻿using System;
using System.Collections.Generic;
using System.Text;

namespace daSyntaxAnalyser.SyntaxTree
{
    using daBase.Objects;

    /// <summary>
    /// Унарное выражение
    /// </summary>
    public class UnaryExpressionElement : ExpressionElement
    {
        protected TokenInfo type;
        protected ExpressionElement operand;

        /// <summary>
        /// Тип выражения (оператор)
        /// </summary>
        public TokenInfo Type { get { return type; } set { type = value; } }

        /// <summary>
        /// Операнд
        /// </summary>
        public ExpressionElement Operand { get { return operand; } set { operand = value; } }

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Type">тип выражения (оператор)</param>
        /// <param name="Operand">операнд</param>
        /// <param name="Comments">комментарии, относящиеся к элементу</param>
        public UnaryExpressionElement(TokenInfo Type, ExpressionElement Operand, List<TokenInfo> Comments)
            : base(Type, Comments)
        {
            type = Type;
            operand = Operand;
        }


        /// <summary>
        /// Представление элемента в строковом формате
        /// </summary>
        /// <returns>строковое представление элемента</returns>
        public override string ToString()
        {
            switch (type.Token)
            {
                case DelphiTokens.Not:
                case DelphiTokens.Inherited:
                    return string.Format("{0} {1}", type, operand);
                default:
                    return string.Format("{0}{1}", type, operand);
            }
        }

        /// <summary>
        /// Создание типизированного энумератора
        /// </summary>
        /// <returns>энумератор</returns>
        protected override IEnumerator<ISyntaxTreeElement> CreateEnumerator()
        {
            yield return operand;
        }
    }
}
